第二章 模型,提示和输出解释器

本章我们将简要介绍关于 LLM 开发的一些重要概念:模型、提示与解释器。如果您已完整学习过前面两个部分的内容,对这三个概念不会陌生。但是,在 LangChain 的定义中,对这三个概念的定义与使用又与之前有着细微的差别。我们仍然推荐您认真阅读本章,以进一步深入了解 LLM 开发。同时,如果您直接学习本部分的话,本章内容更是重要的基础。

我们首先向您演示直接调用 OpenAI 的场景,以充分说明为什么我们需要使用 LangChain。

一、直接调用OpenAI

1.1 计算1+1

我们来看一个简单的例子,直接使用通过 OpenAI 接口封装的函数get_completion来让模型告诉我们:1+1是什么?

  1. from tool import get_completion
  2. get_completion("1+1是什么?")
  1. '1+1等于2。'

1.2 用普通话表达海盗邮件

在上述简单示例中,模型gpt-3.5-turbo为我们提供了关于1+1是什么的答案。而现在,我们进入一个更为丰富和复杂的场景。

设想一下,你是一家电商公司的员工。你们的客户中有一位名为海盗A的特殊顾客。他在你们的平台上购买了一个榨汁机,目的是为了制作美味的奶昔。但在制作过程中,由于某种原因,奶昔的盖子突然弹开,导致厨房的墙上洒满了奶昔。想象一下这名海盗的愤怒和挫败之情。他用充满海盗特色的英语方言,给你们的客服中心写了一封邮件:customer_email

  1. customer_email = """
  2. 嗯呐,我现在可是火冒三丈,我那个搅拌机盖子竟然飞了出去,把我厨房的墙壁都溅上了果汁!
  3. 更糟糕的是,保修条款可不包括清理我厨房的费用。
  4. 伙计,赶紧给我过来!
  5. """

在处理来自多元文化背景的顾客时,我们的客服团队可能会遇到某些特殊的语言障碍。如上,我们收到了一名海盗客户的邮件,而他的表达方式对于我们的客服团队来说略显生涩。

为了解决这一挑战,我们设定了以下两个目标:

  • 首先,我们希望模型能够将这封充满海盗方言的邮件翻译成普通话,这样客服团队就能更容易地理解其内容。
  • 其次,在进行翻译时,我们期望模型能采用平和和尊重的语气,这不仅能确保信息准确传达,还能保持与顾客之间的和谐关系。

为了指导模型的输出,我们定义了一个文本表达风格标签,简称为style

  1. # 普通话 + 平静、尊敬的语调
  2. style = """正式普通话 \
  3. 用一个平静、尊敬、有礼貌的语调
  4. """

下一步我们需要做的是将customer_emailstyle结合起来构造我们的提示:prompt

  1. # 要求模型根据给出的语调进行转化
  2. prompt = f"""把由三个反引号分隔的文本\
  3. 翻译成一种{style}风格。
  4. 文本: ```{customer_email}

“””

print(“提示:”, prompt)

  1. 提示:
  2. 把由三个反引号分隔的文本翻译成一种正式普通话 用一个平静、尊敬、有礼貌的语调
  3. 风格。
  4. 文本:
  1. 嗯呐,我现在可是火冒三丈,我那个搅拌机盖子竟然飞了出去,把我厨房的墙壁都溅上了果汁!
  2. 更糟糕的是,保修条款可不包括清理我厨房的费用。
  3. 伙计,赶紧给我过来!
  4. ```

经过精心设计的prompt已经准备就绪。接下来,只需调用get_completion方法,我们就可以获得期望的输出——那封原汁原味的海盗方言邮件,将被翻译成既平和又尊重的正式普通话表达。

  1. response = get_completion(prompt)
  2. print(response)
  1. 非常抱歉,我现在感到非常愤怒和不满。我的搅拌机盖子竟然飞了出去,导致我厨房的墙壁上都溅满了果汁!更糟糕的是,保修条款并不包括清理我厨房的费用。先生/女士,请您尽快过来处理这个问题!

在进行语言风格转换之后,我们可以观察到明显的变化:原本的用词变得更为正式,那些带有极端情绪的表达得到了替代,并且文本中还加入了表示感激的词汇。

小建议:你可以调整并尝试不同的提示,来探索模型能为你带来怎样的创新性输出。每次尝试都可能为你带来意想不到的惊喜!

二、通过LangChain使用OpenAI

在前面的小节中,我们使用了封装好的函数get_completion,利用 OpenAI 接口成功地对那封充满方言特色的邮件进行了翻译。得到一封采用平和且尊重的语气、并用标准普通话所写的邮件。接下来,我们将尝试使用 LangChain 解决该问题。

2.1 模型

现在让我们尝试使用LangChain来实现相同的功能。从langchain.chat_models导入OpenAI的对话模型ChatOpenAI。 除去OpenAI以外,langchain.chat_models还集成了其他对话模型,更多细节可以查看 Langchain 官方文档(https://python.langchain.com/en/latest/modules/models/chat/integrations.html)。

  1. from langchain.chat_models import ChatOpenAI
  2. # 这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。
  3. # 如果你想要每次得到不一样的有新意的答案,可以尝试调整该参数。
  4. chat = ChatOpenAI(temperature=0.0)
  5. chat
  1. ChatOpenAI(cache=None, verbose=False, callbacks=None, callback_manager=None, tags=None, metadata=None, client=<class 'openai.api_resources.chat_completion.ChatCompletion'>, model_name='gpt-3.5-turbo', temperature=0.0, model_kwargs={}, openai_api_key='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', openai_api_base='', openai_organization='', openai_proxy='', request_timeout=None, max_retries=6, streaming=False, n=1, max_tokens=None, tiktoken_model_name=None)


上面的输出显示ChatOpenAI的默认模型为gpt-3.5-turbo

2.2 使用提示模版

在前面的例子中,我们通过f字符串把Python表达式的值stylecustomer_email添加到prompt字符串内。

langchain提供了接口方便快速的构造和使用提示。

2.2.1 用普通话表达海盗邮件

现在我们来看看如何使用langchain来构造提示吧!

  1. from langchain.prompts import ChatPromptTemplate
  2. # 首先,构造一个提示模版字符串:`template_string`
  3. template_string = """把由三个反引号分隔的文本\
  4. 翻译成一种{style}风格。\
  5. 文本: ```{text}

“””

然后,我们调用ChatPromptTemplatee.from_template()函数将

上面的提示模版字符template_string转换为提示模版prompt_template

prompt_template = ChatPromptTemplate.from_template(template_string)

print(“\n”, prompt_template.messages[0].prompt)

  1. input_variables=['style', 'text'] output_parser=None partial_variables={} template='把由三个反引号分隔的文本翻译成一种{style}风格。文本: ```{text}```\n' template_format='f-string' validate_template=True
  2. <br>
  3. 对于给定的`customer_style``customer_email`, 我们可以使用提示模版`prompt_template``format_messages`方法生成想要的客户消息`customer_messages`
  4. 提示模版`prompt_template`需要两个输入变量: `style` `text` 这里分别对应
  5. - `customer_style`: 我们想要的顾客邮件风格
  6. - `customer_email`: 顾客的原始邮件文本。
  7. ```python
  8. customer_style = """正式普通话 \
  9. 用一个平静、尊敬的语气
  10. """
  11. customer_email = """
  12. 嗯呐,我现在可是火冒三丈,我那个搅拌机盖子竟然飞了出去,把我厨房的墙壁都溅上了果汁!
  13. 更糟糕的是,保修条款可不包括清理我厨房的费用。
  14. 伙计,赶紧给我过来!
  15. """
  16. # 使用提示模版
  17. customer_messages = prompt_template.format_messages(
  18. style=customer_style,
  19. text=customer_email)
  20. # 打印客户消息类型
  21. print("客户消息类型:",type(customer_messages),"\n")
  22. # 打印第一个客户消息类型
  23. print("第一个客户客户消息类型类型:", type(customer_messages[0]),"\n")
  24. # 打印第一个元素
  25. print("第一个客户客户消息类型类型: ", customer_messages[0],"\n")
  1. 客户消息类型:
  2. <class 'list'>
  3. 第一个客户客户消息类型类型:
  4. <class 'langchain.schema.messages.HumanMessage'>
  5. 第一个客户客户消息类型类型:
  6. content='把由三个反引号分隔的文本翻译成一种正式普通话 用一个平静、尊敬的语气\n风格。文本: ```\n嗯呐,我现在可是火冒三丈,我那个搅拌机盖子竟然飞了出去,把我厨房的墙壁都溅上了果汁!\n更糟糕的是,保修条款可不包括清理我厨房的费用。\n伙计,赶紧给我过来!\n```\n' additional_kwargs={} example=False


可以看出

  • customer_messages变量类型为列表(list)
  • 列表里的元素变量类型为langchain自定义消息(langchain.schema.HumanMessage)。


现在我们可以调用模型部分定义的chat模型来实现转换客户消息风格。

  1. customer_response = chat(customer_messages)
  2. print(customer_response.content)
  1. 非常抱歉,我现在感到非常愤怒。我的搅拌机盖子竟然飞了出去,导致我厨房的墙壁上都溅满了果汁!更糟糕的是,保修条款并不包括清理我厨房的费用。伙计,请你尽快过来帮我解决这个问题!

2.2.2 用海盗方言回复邮件

到目前为止,我们已经实现了在前一部分的任务。接下来,我们更进一步,将客服人员回复的消息,转换为海盗风格英语,并确保消息比较有礼貌。 这里,我们可以继续使用起前面构造的的langchain提示模版,来获得我们回复消息提示。

  1. service_reply = """嘿,顾客, \
  2. 保修不包括厨房的清洁费用, \
  3. 因为您在启动搅拌机之前 \
  4. 忘记盖上盖子而误用搅拌机, \
  5. 这是您的错。 \
  6. 倒霉! 再见!
  7. """
  8. service_style_pirate = """\
  9. 一个有礼貌的语气 \
  10. 使用海盗风格\
  11. """
  12. service_messages = prompt_template.format_messages(
  13. style=service_style_pirate,
  14. text=service_reply)
  15. print("\n", service_messages[0].content)
  1. 把由三个反引号分隔的文本翻译成一种一个有礼貌的语气 使用海盗风格风格。文本: ```嘿,顾客, 保修不包括厨房的清洁费用, 因为您在启动搅拌机之前 忘记盖上盖子而误用搅拌机, 这是您的错。 倒霉! 再见!
  2. ```
  1. # 调用模型部分定义的chat模型来转换回复消息风格
  2. service_response = chat(service_messages)
  3. print(service_response.content)
  1. 嘿,尊贵的客户啊,保修可不包括厨房的清洁费用,因为您在启动搅拌机之前竟然忘记盖上盖子而误用了搅拌机,这可是您的疏忽之过啊。真是倒霉透顶啊!祝您一路顺风!

2.2.3 为什么需要提示模版

在应用于比较复杂的场景时,提示可能会非常长并且包含涉及许多细节。使用提示模版,可以让我们更为方便地重复使用设计好的提示。英文版提示2.2.3 给出了作业的提示模版案例:学生们线上学习并提交作业,通过提示来实现对学生的提交的作业的评分。

此外,LangChain还提供了提示模版用于一些常用场景。比如自动摘要、问答、连接到SQL数据库、连接到不同的API。通过使用LangChain内置的提示模版,你可以快速建立自己的大模型应用,而不需要花时间去设计和构造提示。

最后,我们在建立大模型应用时,通常希望模型的输出为给定的格式,比如在输出使用特定的关键词来让输出结构化。英文版提示2.2.3 给出了使用大模型进行链式思考推理结果示例 — 对于问题:What is the elevation range for the area that the eastern sector of the Colorado orogeny extends into? 通过使用LangChain库函数,输出采用”Thought”(思考)、”Action”(行动)、”Observation”(观察)作为链式思考推理的关键词,让输出结构化。

2.3 输出解析器

2.3.1 不使用输出解释器提取客户评价中的信息

对于给定的评价customer_review, 我们希望提取信息,并按以下格式输出:

  1. {
  2. "gift": False,
  3. "delivery_days": 5,
  4. "price_value": "pretty affordable!"
  5. }
  1. from langchain.prompts import ChatPromptTemplate
  2. customer_review = """\
  3. 这款吹叶机非常神奇。 它有四个设置:\
  4. 吹蜡烛、微风、风城、龙卷风。 \
  5. 两天后就到了,正好赶上我妻子的\
  6. 周年纪念礼物。 \
  7. 我想我的妻子会喜欢它到说不出话来。 \
  8. 到目前为止,我是唯一一个使用它的人,而且我一直\
  9. 每隔一天早上用它来清理草坪上的叶子。 \
  10. 它比其他吹叶机稍微贵一点,\
  11. 但我认为它的额外功能是值得的。
  12. """
  13. review_template = """\
  14. 对于以下文本,请从中提取以下信息:
  15. 礼物:该商品是作为礼物送给别人的吗? \
  16. 如果是,则回答 是的;如果否或未知,则回答 不是。
  17. 交货天数:产品需要多少天\
  18. 到达? 如果没有找到该信息,则输出-1。
  19. 价钱:提取有关价值或价格的任何句子,\
  20. 并将它们输出为逗号分隔的 Python 列表。
  21. 使用以下键将输出格式化为 JSON:
  22. 礼物
  23. 交货天数
  24. 价钱
  25. 文本: {text}
  26. """
  27. prompt_template = ChatPromptTemplate.from_template(review_template)
  28. print("提示模版:", prompt_template)
  29. messages = prompt_template.format_messages(text=customer_review)
  30. chat = ChatOpenAI(temperature=0.0)
  31. response = chat(messages)
  32. print("结果类型:", type(response.content))
  33. print("结果:", response.content)
  1. 提示模版:
  2. input_variables=['text'] output_parser=None partial_variables={} messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['text'], output_parser=None, partial_variables={}, template='对于以下文本,请从中提取以下信息:\n\n礼物:该商品是作为礼物送给别人的吗? 如果是,则回答 是的;如果否或未知,则回答 不是。\n\n交货天数:产品需要多少天到达? 如果没有找到该信息,则输出-1。\n\n价钱:提取有关价值或价格的任何句子,并将它们输出为逗号分隔的 Python 列表。\n\n使用以下键将输出格式化为 JSON:\n礼物\n交货天数\n价钱\n\n文本: {text}\n', template_format='f-string', validate_template=True), additional_kwargs={})]
  3. 结果类型:
  4. <class 'str'>
  5. 结果:
  6. {
  7. "礼物": "是的",
  8. "交货天数": 2,
  9. "价钱": ["它比其他吹叶机稍微贵一点"]
  10. }

可以看出 response.content类型为字符串(str),而并非字典(dict), 如果想要从中更方便的提取信息,我们需要使用Langchain中的输出解释器。

2.3.2 使用输出解析器提取客户评价中的信息

接下来,我们将展示如何使用输出解释器。

  1. review_template_2 = """\
  2. 对于以下文本,请从中提取以下信息::
  3. 礼物:该商品是作为礼物送给别人的吗?
  4. 如果是,则回答 是的;如果否或未知,则回答 不是。
  5. 交货天数:产品到达需要多少天? 如果没有找到该信息,则输出-1。
  6. 价钱:提取有关价值或价格的任何句子,并将它们输出为逗号分隔的 Python 列表。
  7. 文本: {text}
  8. {format_instructions}
  9. """
  10. prompt = ChatPromptTemplate.from_template(template=review_template_2)
  11. from langchain.output_parsers import ResponseSchema
  12. from langchain.output_parsers import StructuredOutputParser
  13. gift_schema = ResponseSchema(name="礼物",
  14. description="这件物品是作为礼物送给别人的吗?\
  15. 如果是,则回答 是的,\
  16. 如果否或未知,则回答 不是。")
  17. delivery_days_schema = ResponseSchema(name="交货天数",
  18. description="产品需要多少天才能到达?\
  19. 如果没有找到该信息,则输出-1。")
  20. price_value_schema = ResponseSchema(name="价钱",
  21. description="提取有关价值或价格的任何句子,\
  22. 并将它们输出为逗号分隔的 Python 列表")
  23. response_schemas = [gift_schema,
  24. delivery_days_schema,
  25. price_value_schema]
  26. output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
  27. format_instructions = output_parser.get_format_instructions()
  28. print("输出格式规定:",format_instructions)
  1. 输出格式规定:
  2. The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":
  3. ```json
  4. {
  5. "礼物": string // 这件物品是作为礼物送给别人的吗? 如果是,则回答 是的, 如果否或未知,则回答 不是。
  6. "交货天数": string // 产品需要多少天才能到达? 如果没有找到该信息,则输出-1。
  7. "价钱": string // 提取有关价值或价格的任何句子, 并将它们输出为逗号分隔的 Python 列表
  8. }
  9. ```
  1. messages = prompt.format_messages(text=customer_review, format_instructions=format_instructions)
  2. print("第一条客户消息:",messages[0].content)
  1. 第一条客户消息:
  2. 对于以下文本,请从中提取以下信息::
  3. 礼物:该商品是作为礼物送给别人的吗?
  4. 如果是,则回答 是的;如果否或未知,则回答 不是。
  5. 交货天数:产品到达需要多少天? 如果没有找到该信息,则输出-1
  6. 价钱:提取有关价值或价格的任何句子,并将它们输出为逗号分隔的 Python 列表。
  7. 文本: 这款吹叶机非常神奇。 它有四个设置:吹蜡烛、微风、风城、龙卷风。 两天后就到了,正好赶上我妻子的周年纪念礼物。 我想我的妻子会喜欢它到说不出话来。 到目前为止,我是唯一一个使用它的人,而且我一直每隔一天早上用它来清理草坪上的叶子。 它比其他吹叶机稍微贵一点,但我认为它的额外功能是值得的。
  8. The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":
  9. ```json
  10. {
  11. "礼物": string // 这件物品是作为礼物送给别人的吗? 如果是,则回答 是的, 如果否或未知,则回答 不是。
  12. "交货天数": string // 产品需要多少天才能到达? 如果没有找到该信息,则输出-1。
  13. "价钱": string // 提取有关价值或价格的任何句子, 并将它们输出为逗号分隔的 Python 列表
  14. }
  15. ```
  1. response = chat(messages)
  2. print("结果类型:", type(response.content))
  3. print("结果:", response.content)
  1. 结果类型:
  2. <class 'str'>
  3. 结果:
  4. ```json
  5. {
  6. "礼物": "不是",
  7. "交货天数": "两天后就到了",
  8. "价钱": "它比其他吹叶机稍微贵一点"
  9. }
  10. ```
  1. output_dict = output_parser.parse(response.content)
  2. print("解析后的结果类型:", type(output_dict))
  3. print("解析后的结果:", output_dict)
  1. 解析后的结果类型:
  2. <class 'dict'>
  3. 解析后的结果:
  4. {'礼物': '不是', '交货天数': '两天后就到了', '价钱': '它比其他吹叶机稍微贵一点'}

output_dict类型为字典(dict), 可直接使用get方法。这样的输出更方便下游任务的处理。

三、英文版提示

1.2 用美式英语表达海盗邮件

  1. customer_email = """
  2. Arrr, I be fuming that me blender lid \
  3. flew off and splattered me kitchen walls \
  4. with smoothie! And to make matters worse,\
  5. the warranty don't cover the cost of \
  6. cleaning up me kitchen. I need yer help \
  7. right now, matey!
  8. """
  9. # 美式英语 + 平静、尊敬的语调
  10. style = """American English \
  11. in a calm and respectful tone
  12. """
  13. # 要求模型根据给出的语调进行转化
  14. prompt = f"""Translate the text \
  15. that is delimited by triple backticks
  16. into a style that is {style}.
  17. text: ```{customer_email}

“””

print(“提示:”, prompt)

response = get_completion(prompt)

print(“美式英语表达的海盗邮件: “, response)

  1. 提示:
  2. Translate the text that is delimited by triple backticks
  3. into a style that is American English in a calm and respectful tone
  4. .
  5. text:
  1. Arrr, I be fuming that me blender lid flew off and splattered me kitchen walls with smoothie! And to make matters worse,the warranty don't cover the cost of cleaning up me kitchen. I need yer help right now, matey!
  2. ```
  3. 美式英语表达的海盗邮件:
  4. I am quite frustrated that my blender lid flew off and made a mess of my kitchen walls with smoothie! To add to my frustration, the warranty does not cover the cost of cleaning up my kitchen. I kindly request your assistance at this moment, my friend.

2.2.1 用标准美式英语表达海盗邮件

  1. from langchain.prompts import ChatPromptTemplate
  2. template_string = """Translate the text \
  3. that is delimited by triple backticks \
  4. into a style that is {style}. \
  5. text: ```{text}

“””

prompt_template = ChatPromptTemplate.from_template(template_string)

print(“提示模版中的第一个提示:”, prompt_template.messages[0].prompt)

customer_style = “””American English \ in a calm and respectful tone “””

customer_email = “”” Arrr, I be fuming that me blender lid \ flew off and splattered me kitchen walls \ with smoothie! And to make matters worse, \ the warranty don’t cover the cost of \ cleaning up me kitchen. I need yer help \ right now, matey! “””

customer_messages = prompt_template.format_messages( style=customer_style, text=customer_email)

print(“用提示模版中生成的第一条客户消息:”, customer_messages[0])

  1. 提示模版中的第一个提示:
  2. input_variables=['style', 'text'] output_parser=None partial_variables={} template='Translate the text that is delimited by triple backticks into a style that is {style}. text: ```{text}```\n' template_format='f-string' validate_template=True
  3. 用提示模版中生成的第一条客户消息:
  4. content="Translate the text that is delimited by triple backticks into a style that is American English in a calm and respectful tone\n. text: ```\nArrr, I be fuming that me blender lid flew off and splattered me kitchen walls with smoothie! And to make matters worse, the warranty don't cover the cost of cleaning up me kitchen. I need yer help right now, matey!\n```\n" additional_kwargs={} example=False
  5. **2.2.2 用海盗方言回复邮件**
  6. ```python
  7. service_reply = """Hey there customer, \
  8. the warranty does not cover \
  9. cleaning expenses for your kitchen \
  10. because it's your fault that \
  11. you misused your blender \
  12. by forgetting to put the lid on before \
  13. starting the blender. \
  14. Tough luck! See ya!
  15. """
  16. service_style_pirate = """\
  17. a polite tone \
  18. that speaks in English Pirate\
  19. """
  20. service_messages = prompt_template.format_messages(
  21. style=service_style_pirate,
  22. text=service_reply)
  23. print("提示模版中的第一条客户消息内容:", service_messages[0].content)
  24. service_response = chat(service_messages)
  25. print("模型得到的回复邮件:", service_response.content)
  1. 提示模版中的第一条客户消息内容:
  2. Translate the text that is delimited by triple backticks into a style that is a polite tone that speaks in English Pirate. text: ```Hey there customer, the warranty does not cover cleaning expenses for your kitchen because it's your fault that you misused your blender by forgetting to put the lid on before starting the blender. Tough luck! See ya!
  3. ```
  4. 模型得到的回复内容:
  5. Ahoy there, matey! I regret to inform ye that the warranty be not coverin' the costs o' cleanin' yer galley, as 'tis yer own fault fer misusin' yer blender by forgettin' to secure the lid afore startin' it. Aye, tough luck, me heartie! Fare thee well!

2.3.1 不使用输出解释器提取客户评价中的信息

  1. customer_review = """\
  2. This leaf blower is pretty amazing. It has four settings:\
  3. candle blower, gentle breeze, windy city, and tornado. \
  4. It arrived in two days, just in time for my wife's \
  5. anniversary present. \
  6. I think my wife liked it so much she was speechless. \
  7. So far I've been the only one using it, and I've been \
  8. using it every other morning to clear the leaves on our lawn. \
  9. It's slightly more expensive than the other leaf blowers \
  10. out there, but I think it's worth it for the extra features.
  11. """
  12. review_template = """\
  13. For the following text, extract the following information:
  14. gift: Was the item purchased as a gift for someone else? \
  15. Answer True if yes, False if not or unknown.
  16. delivery_days: How many days did it take for the product \
  17. to arrive? If this information is not found, output -1.
  18. price_value: Extract any sentences about the value or price,\
  19. and output them as a comma separated Python list.
  20. Format the output as JSON with the following keys:
  21. gift
  22. delivery_days
  23. price_value
  24. text: {text}
  25. """
  26. from langchain.prompts import ChatPromptTemplate
  27. prompt_template = ChatPromptTemplate.from_template(review_template)
  28. print("提示模版:",prompt_template)
  29. messages = prompt_template.format_messages(text=customer_review)
  30. chat = ChatOpenAI(temperature=0.0)
  31. response = chat(messages)
  32. print("回复内容:",response.content)
  1. 提示模版:
  2. input_variables=['text'] output_parser=None partial_variables={} messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['text'], output_parser=None, partial_variables={}, template='For the following text, extract the following information:\n\ngift: Was the item purchased as a gift for someone else? Answer True if yes, False if not or unknown.\n\ndelivery_days: How many days did it take for the product to arrive? If this information is not found, output -1.\n\nprice_value: Extract any sentences about the value or price,and output them as a comma separated Python list.\n\nFormat the output as JSON with the following keys:\ngift\ndelivery_days\nprice_value\n\ntext: {text}\n', template_format='f-string', validate_template=True), additional_kwargs={})]
  3. 回复内容:
  4. {
  5. "gift": false,
  6. "delivery_days": 2,
  7. "price_value": ["It's slightly more expensive than the other leaf blowers out there, but I think it's worth it for the extra features."]
  8. }

2.3.2 使用输出解析器提取客户评价中的信息

  1. review_template_2 = """\
  2. For the following text, extract the following information:
  3. gift: Was the item purchased as a gift for someone else? \
  4. Answer True if yes, False if not or unknown.
  5. delivery_days: How many days did it take for the product\
  6. to arrive? If this information is not found, output -1.
  7. price_value: Extract any sentences about the value or price,\
  8. and output them as a comma separated Python list.
  9. text: {text}
  10. {format_instructions}
  11. """
  12. prompt = ChatPromptTemplate.from_template(template=review_template_2)
  13. from langchain.output_parsers import ResponseSchema
  14. from langchain.output_parsers import StructuredOutputParser
  15. gift_schema = ResponseSchema(name="gift",
  16. description="Was the item purchased\
  17. as a gift for someone else? \
  18. Answer True if yes,\
  19. False if not or unknown.")
  20. delivery_days_schema = ResponseSchema(name="delivery_days",
  21. description="How many days\
  22. did it take for the product\
  23. to arrive? If this \
  24. information is not found,\
  25. output -1.")
  26. price_value_schema = ResponseSchema(name="price_value",
  27. description="Extract any\
  28. sentences about the value or \
  29. price, and output them as a \
  30. comma separated Python list.")
  31. response_schemas = [gift_schema,
  32. delivery_days_schema,
  33. price_value_schema]
  34. output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
  35. format_instructions = output_parser.get_format_instructions()
  36. print(format_instructions)
  37. messages = prompt.format_messages(text=customer_review, format_instructions=format_instructions)
  38. print("提示消息:", messages[0].content)
  39. response = chat(messages)
  40. print("回复内容:",response.content)
  41. output_dict = output_parser.parse(response.content)
  42. print("解析后的结果类型:", type(output_dict))
  43. print("解析后的结果:", output_dict)
  1. The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":
  2. ```json
  3. {
  4. "gift": string // Was the item purchased as a gift for someone else? Answer True if yes, False if not or unknown.
  5. "delivery_days": string // How many days did it take for the product to arrive? If this information is not found, output -1.
  6. "price_value": string // Extract any sentences about the value or price, and output them as a comma separated Python list.
  7. }
  8. ```
  9. 提示消息:
  10. For the following text, extract the following information:
  11. gift: Was the item purchased as a gift for someone else? Answer True if yes, False if not or unknown.
  12. delivery_days: How many days did it take for the productto arrive? If this information is not found, output -1.
  13. price_value: Extract any sentences about the value or price,and output them as a comma separated Python list.
  14. text: This leaf blower is pretty amazing. It has four settings:candle blower, gentle breeze, windy city, and tornado. It arrived in two days, just in time for my wife's anniversary present. I think my wife liked it so much she was speechless. So far I've been the only one using it, and I've been using it every other morning to clear the leaves on our lawn. It's slightly more expensive than the other leaf blowers out there, but I think it's worth it for the extra features.
  15. The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":
  16. ```json
  17. {
  18. "gift": string // Was the item purchased as a gift for someone else? Answer True if yes, False if not or unknown.
  19. "delivery_days": string // How many days did it take for the product to arrive? If this information is not found, output -1.
  20. "price_value": string // Extract any sentences about the value or price, and output them as a comma separated Python list.
  21. }
  22. ```
  23. 回复内容:
  24. ```json
  25. {
  26. "gift": false,
  27. "delivery_days": "2",
  28. "price_value": "It's slightly more expensive than the other leaf blowers out there, but I think it's worth it for the extra features."
  29. }
  30. ```
  31. 解析后的结果类型:
  32. <class 'dict'>
  33. 解析后的结果:
  34. {'gift': False, 'delivery_days': '2', 'price_value': "It's slightly more expensive than the other leaf blowers out there, but I think it's worth it for the extra features."}